package com.molichuxing.framework.utils;

import java.util.ArrayList;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.jetbrains.annotations.Contract;

public class ValidateUtil {

	/**
	 * 判断给定的字符串是否是数值型
	 * 
	 * @param strNumber
	 *            要确认的字符串
	 * @return
	 */
	public static boolean isNumber(String strNumber) {
		final String keyStr = "-";
		if (strNumber.startsWith(keyStr)) {
			strNumber = strNumber.substring(1);
		}
		return strNumber.matches("^([0-9])[0-9]*(\\.\\w*)?$");
	}

	/**
	 * 判断给定的数字是否在执行的范围中
	 *
	 * @param number
	 *            要确认的字符串
	 * @param min
	 *            最小值
	 * @param max
	 *            最大值
	 * @return
	 */
	@Contract(pure = true)
	public static boolean isNumberRange(double number, double min, double max) {
		if (min <= number && number <= max) {
			return true;
		} else {
			return false;
		}
	}

	/**
	 * 判断给定的数字是否在执行的范围中
	 * 
	 * @param number
	 *            要确认的字符串
	 * @param min
	 *            最小值
	 * @param max
	 *            最大值
	 * @return
	 */
	@Contract(pure = true)
	public static boolean isNumberRange(int number, int min, int max) {
		if (min <= number && number <= max) {
			return true;
		} else {
			return false;
		}
	}

	/**
	 * 判断给定的字符串数组中的数据是不是都为数值型
	 */
	@Contract("null -> false")
	public static boolean isNumberArray(String[] strNumber) {
		if (strNumber == null) {
			return false;
		}
		if (strNumber.length < 1) {
			return false;
		}
		for (String id : strNumber) {
			if (!isNumber(id)) {
				return false;
			}
		}
		return true;
	}

	/**
	 * 是否符合email格式
	 * 
	 * @param strEmail
	 *            要判断的email字符串
	 */
	public static boolean isValidEmail(String strEmail) {
		String regex = "\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*";
		return strEmail.matches(regex);
	}

	/**
	 * 判断是否为base64字符串
	 * 
	 * @param str
	 */
	public static boolean isBase64String(String str) {
		// A-Z, a-z, 0-9, +, /, =
		return str.matches("[A-Za-z0-9+/=]");
	}

	/**
	 * 检测是否有Sql危险字符
	 *
	 * @param str
	 *            要判断字符串 判断结果
	 */
	public static boolean isSafeSqlString(String str) {
		return !str.matches("[-|;|,|/|(|)|\\[|\\]|}|{|%|@|*|!|']");
	}

	/**
	 * 检测是否有危险的可能用于链接的字符串
	 * 
	 * @param str
	 *            要判断字符串 判断结果
	 */
	public static boolean isSafeUserInfoString(String str) {
		return !str.matches("/^\\s*$|^c:\\\\con\\\\con$|[%,*\"\\s\t<>&]|$guestexp/is");
	}

	/**
	 * 是否是时间 HH:mm:ss
	 */
	public static boolean isTime(String time) {
		return time.matches("^((([0-1]?[0-9])|(2[0-3])):([0-5]?[0-9])(:[0-5]?[0-9])?)$");
	}

	/**
	 * 是否为ip
	 * 
	 * @param ip
	 */
	public static boolean isIp(String ip) {
		return ip.matches("^((2[0-4]\\d|25[0-5]|[01]?\\d\\d?)\\.){3}(2[0-4]\\d|25[0-5]|[01]?\\d\\d?)$");
	}

	/**
	 * 是否yy-mm-dd字符串
	 * 
	 * @param str
	 *            待判断字符串 判断结果
	 */
	public static boolean isDateString(String str) {

		return str.matches("(\\d{4})-(\\d{1,2})-(\\d{1,2})");
	}

	/**
	 * 是否0001-06-16 12:00:01 AM|||2004/2/29|||3:30 PM字符串
	 * 
	 * @param str
	 *            待判断字符串 判断结果
	 */
	public static boolean isDateTimeString(String str) {
		// 1980-1-1
		// 1980-01-1
		// 1980-1-01
		// 1980-1-1 1:1
		// 1980-1-1 01:1
		// 1980-1-1 1:01
		final String keyStr = " ";
		if (str.contains(keyStr)) {
			return isDateString(str.substring(0, str.indexOf(keyStr)))
					&& isTime(str.substring(str.indexOf(keyStr) + 1));
		} else {
			return isDateString(str);
		}
	}

	/**
	 * 是否为浏览器可以直接显示的图片文件名
	 *
	 * @param filename
	 *            文件名 是否可以直接显示
	 */
	public static boolean isImgFilename(String filename) {
		final String keyStr = ".";
		filename = filename.trim();
		if (filename.endsWith(keyStr) || filename.indexOf(keyStr) == -1) {
			return false;
		}
		String extname = filename.substring(filename.lastIndexOf(keyStr) + 1).toLowerCase();
		return "jpg".equals(extname) || "jpeg".equals(extname) || "png".equals(extname) || "bmp".equals(extname)
				|| "gif".equals(extname);
	}

	/**
	 * 是否是手机号格式
	 * 
	 * @param mobiles
	 * @return
	 */
	public static boolean isMobileNo(String mobiles) {
		String regex = "^(\\(\\d{3,4}\\)|\\d{3,4}-)?\\d{7,8}$";
		return mobiles.matches(regex);
	}

	/**
	 * 固定电话验证 规则：3到4位数字开头 + ["-"] + 7到8位数字， 或3到4位数字开头 + "-" + 4位数字 + "-" +
	 * 3到4位数字， 如：010-89920102，01089920102，010-8992-123，010-8992-1234
	 *
	 * @param telephone
	 * @return
	 */
	public static boolean isTelephone(String telephone) {
		String regex = "^((\\d{3,4}|\\d{3,4}-)?\\d{7,8})|" + "(\\d{3,4}?-\\d{4}-\\d{3,4})$";
		return telephone.matches(regex);
	}

	/**
	 * 是否身份证好 规则：15位或18位数字或17数数字+1位X
	 *
	 * @param idNumber
	 * @return
	 */
	private static Pattern idCardNumberPattern = Pattern.compile("^\\d{15}|\\d{18}|\\d{17}[xX]$");

	public static boolean isIdCardNumber(String idNumber) {
		Matcher m = idCardNumberPattern.matcher(idNumber);
		if (!m.matches()) {
			return false;
		}
		return true;
	}

	/**
	 * 判断是否为中英文数字
	 *
	 * @param chinese
	 * @return
	 */
	private static Pattern chinesePattern = Pattern.compile("^[\u4E00-\u9FA5A-Za-z0-9_]+$");

	public static boolean isChinese(String chinese) {
		Matcher m = chinesePattern.matcher(chinese);
		if (!m.matches()) {
			return false;
		}
		return true;
	}

	/**
	 * 针对公司名称做的验证 中英文数字()（）
	 *
	 * @param companyName
	 * @return
	 */
	private static Pattern companyNamePattern = Pattern.compile("^[\u4E00-\u9FA5A-Za-z0-9()（）_]+$");

	public static boolean isCompanyName(String companyName) {
		Matcher m = companyNamePattern.matcher(companyName);
		if (!m.matches()) {
			return false;
		}
		return true;
	}

	private static Pattern passportPattern = Pattern.compile("^[a-zA-Z][0-9]{7,15}$");

	public static boolean isPassport(String passport) {
		Matcher m = passportPattern.matcher(passport);
		if (!m.matches()) {
			return false;
		}
		return true;
	}

	/**
	 * 判断给定的字符串是否是大于等于0的整数
	 *
	 * @param strNumber
	 *            要确认的字符串
	 * @return
	 */
	public static boolean isPositiveInteger (String strNumber) {
		return strNumber.matches("^[+]{0,1}(\\d+)$");
	}

	public static void main(String[] args) {
		System.out.println(new ArrayList<>(0));

	}

}
